;void agregar_item_ordenado(Lista* la_lista, SDL_Surface* surfacePers, SDL_Surface* surfaceGen, Uint32 x, Uint32 y, Uint32 ID);

%include "nodo.mac"

extern malloc
extern inicializar_nodo

global agregar_item_ordenado

%define p_nuevo [ebp - 4]
%define p_lista [ebp + 8]
%define p_surfacePers [ebp + 12]
%define p_surfaceGen [ebp + 16]
%define x [ebp + 20]
%define y [ebp + 24]
%define ID [ebp + 28]

section .text

agregar_item_ordenado:
	push ebp
	mov ebp, esp
	sub esp, 4
	push edi
	push esi
	push ebx
	
	mov eax, tam_nodo
	push eax
	call malloc
	add esp, 4
	cmp eax, 0
	jne memoria_ok
	jmp memoria_no_ok
	
memoria_ok:
	mov p_nuevo, eax
	push dword ID
	push dword y
	push dword x
	push dword p_surfaceGen
	push dword p_surfacePers
	push eax
	call inicializar_nodo
	add esp, 24
	
	mov esi, p_lista
	cmp dword [esi], 0
	jne ciclo
	jmp vacia
	
ciclo:
	mov edi, [esi]
	cmp dword [edi + off_p_prox], 0 ; me fijo si el nodo actual es el ultimo
	je ultimo  
	mov ebx, [edi + off_coord_x] ; actual no es el ultimo entonces tiene un nodo posterior
	cmp x, ebx 
	jbe insertar_antes ; el valor x del nuevo nodo nodo es menor o igual al valor x del nodo actual
	lea esi, [edi + off_p_prox]
	jmp ciclo
	
ultimo:
	mov eax, x
	cmp eax, [edi + off_coord_x]
	jbe insertar_antes
	mov eax, p_nuevo
	mov [edi + off_p_prox], eax
	mov [eax + off_p_prev], edi 
	jmp fin
	
insertar_antes:
	cmp dword [edi + off_p_prev], 0 ; me fijo si actual tiene previo . Es decirt, si el primero o no
	je caso_primero ; tengo que meter el nuevo nodo como primero en la lista
	jmp caso_medio ; tengo que insertar  nodo reapuntado sus punteros. El anterior de nodo_nuevo = el anterio de nodo_actual y el sig de nodo_nuevo = nodo_actual 
	; el ant de nodo_actual = nodo_nuevo y el de nodo_actual_ant_sig = nodo_nuevo
	
vacia:
	mov edx, p_nuevo
	mov [esi], edx
	jmp fin

caso_primero:
	mov eax, p_nuevo
	mov [esi], eax ; reapuntar principio de lista
	mov [eax + off_p_prox], edi
	mov [edi + off_p_prev], eax 
	
	jmp fin

caso_medio:
	mov eax, p_nuevo ; muevo el puntero del nuevo nodo a eax
	mov [eax + off_p_prox], edi ; nodo_nuevo_sig = nodo_actual
	mov ebx, [edi + off_p_prev] ; ebx = nodo_actual_ant
	mov [eax + off_p_prev], ebx ; nodo_nuevo_ant = nodo_actual_ant
	mov [ebx + off_p_prox], eax ; nodo_actual_ant_sig = nodo_nuevo
	mov [edi + off_p_prev], eax ; nodo_actual_ant = nodo_nuevo
	jmp fin
	
memoria_no_ok:

fin:
	pop ebx
	pop esi
	pop edi
	add esp, 4
	pop ebp
	ret
